package com.itheima.operator;  // 声明包名，用于组织Java类

// 定义一个公开的类 OperatorDemo6，用于演示逻辑运算符的使用
public class OperatorDemo6 {
    // 定义main方法，程序的入口点
    public static void main(String[] args) {
        // 目标：掌握逻辑运算符的使用
        
        // 调用isMatch方法，判断身高180、体重70、性别女是否符合择偶条件
        // & 是逻辑与运算符，要求所有条件都为true结果才为true
        System.out.println(isMatch(180, 70, '女')); // 输出：true（所有条件都满足）
        
        // 调用isMatch方法，判断身高180、体重70、性别男是否符合择偶条件
        System.out.println(isMatch(180, 70, '男'));  // 输出：false（性别不符合）

        // 调用isMatch2方法，判断身高180、收入10000是否符合找男朋友条件
        // | 是逻辑或运算符，只要有一个条件为true结果就为true
        System.out.println(isMatch2(180, 10000));  // 输出：true（身高满足）
        
        // 调用isMatch2方法，判断身高160、收入1000000是否符合找男朋友条件
        System.out.println(isMatch2(160, 1000000));  // 输出：true（收入满足）
        
        // 调用isMatch2方法，判断身高160、收入100是否符合找男朋友条件
        System.out.println(isMatch2(160, 100)); // 输出：false（两个条件都不满足）

        // 调用isMatch3方法，演示逻辑非运算符（!）的使用
        isMatch3(true);  // 输出：false（逻辑非会取反）

        // 输出分隔线，方便查看不同方法的输出结果
        System.out.println("-----------------------------");

        // 调用isMatch4方法，演示逻辑异或运算符（^）的使用
        isMatch4();

        // 输出分隔线
        System.out.println("-------------------------------");

        // 调用print方法，演示短路逻辑运算符(&&, ||)与非短路逻辑运算符(&, |)的区别
        print();
    }

    // 定义isMatch方法，判断是否满足择偶条件
    // 参数：height（身高）、weight（体重）、sex（性别）
    // 返回值：boolean类型，表示是否满足条件
    public static boolean isMatch(int height, int weight, char sex) {
        // 使用逻辑与运算符(&)连接多个条件
        // & 是逻辑与运算符：只有当所有条件都为true时，结果才为true
        // 这里的条件是：身高>170 并且 体重>=60 并且 体重<=80 并且 性别='女'
        boolean result = height > 170 & weight >= 60 & weight <= 80 & sex == '女';
        
        // 返回判断结果
        return result;
    }

    // 定义isMatch2方法，判断是否符合找男朋友的条件
    // 参数：height（身高）、income（收入）
    // 返回值：boolean类型，表示是否满足条件
    public static boolean isMatch2(int height, int income) {
        // 使用逻辑或运算符(|)连接两个条件
        // | 是逻辑或运算符：只要有一个条件为true，结果就为true
        // 这里的条件是：身高>=180 或者 收入>300000
        boolean result = height >= 180 | income > 300000;
        
        // 返回判断结果
        return result;
    }

    // 定义isMatch3方法，演示逻辑非运算符(!)的使用
    // 参数：flag（一个布尔值）
    // 返回值：无（void）
    public static void isMatch3(boolean flag) {
        // ! 是逻辑非运算符：用于对布尔值取反
        // 如果flag为true，!flag为false；如果flag为false，!flag为true
        // 输出flag的相反值
        System.out.println(!flag);
    }

    // 定义isMatch4方法，演示逻辑异或运算符(^)的使用
    // 返回值：无（void）
    public static void isMatch4() {
        // ^ 是逻辑异或运算符：当两个操作数不同时结果为true，相同时结果为false
        // 演示各种异或运算的结果
        System.out.println(false ^ false); // 输出：false（两个操作数相同）
        System.out.println(true ^ true); // 输出：false（两个操作数相同）
        System.out.println(true ^ false); // 输出：true（两个操作数不同）
        System.out.println(false ^ true); // 输出：true（两个操作数不同）
    }

    // 定义print方法，演示短路逻辑运算符(&&, ||)与非短路逻辑运算符(&, |)的区别
    // 返回值：无（void）
    public static void print() {
        // 定义变量a和b并初始化
        int a = 111;
        int b = 2;
        
        // 注释掉的代码：使用短路与运算符(&&)
        // && 是短路与运算符：如果左边条件为false，右边的表达式不会被执行
        // System.out.println(a > 1000 && ++b > 1); // false，因为左边为false，右边的++b不会执行，b的值保持为2
        
        // 使用非短路与运算符(&)
        // & 是非短路与运算符：即使左边条件为false，右边的表达式仍然会被执行
        // a > 1000 是false，但右边的++b > 1 仍然会执行，b的值变为3
        System.out.println(a > 1000 & ++b > 1);  // 输出：false
        
        // 验证b的值是否增加了（结果为3）
        System.out.println(b); // 输出：3

        // 定义变量i和j并初始化
        int i = 10;
        int j = 20;
        
        // 注释掉的代码：使用短路或运算符(||)
        // || 是短路或运算符：如果左边条件为true，右边的表达式不会被执行
        // System.out.println(i > 6 || ++j > 1); // true，因为左边为true，右边的++j不会执行，j的值保持为20
        
        // 使用非短路或运算符(|)
        // | 是非短路或运算符：即使左边条件为true，右边的表达式仍然会被执行
        // i > 6 是true，但右边的++j > 1 仍然会执行，j的值变为21
        System.out.println(i > 6 | ++j > 1); // 输出：true
        
        // 验证j的值是否增加了（结果为21）
        System.out.println(j); // 输出：21
    }

}
